import * as api from '@/api/api'
import LocaleUtil from "./LocaleUtil";
import { message } from 'ant-design-vue';

export function timeFix () {
  const time = new Date()
  const hour = time.getHours()
  return hour < 9 ? LocaleUtil.getLocale('m.common.tip.morning1') : (hour <= 11 ? LocaleUtil.getLocale('m.common.tip.morning2') : (hour <= 13 ? LocaleUtil.getLocale('m.common.tip.afternoon1') : (hour < 20 ? LocaleUtil.getLocale('m.common.tip.afternoon2') : LocaleUtil.getLocale('m.common.tip.evening'))))
}

/**
 * 触发 window.resize
 */
export function triggerWindowResizeEvent () {
  let event = document.createEvent('HTMLEvents')
  event.initEvent('resize', true, true)
  event.eventType = 'message'
  window.dispatchEvent(event)
}

/**
 * 过滤对象中为空的属性
 * @param obj
 * @returns {*}
 */
export function filterObj (obj) {
  if (!(typeof obj == 'object')) {
    return
  }

  for (let key in obj) {
    if (obj.hasOwnProperty(key)
      && (obj[key] == null || obj[key] == undefined || obj[key] === '')) {
      delete obj[key]
    }
  }
  return obj
}

/**
 * 深度克隆对象、数组
 * @param obj 被克隆的对象
 * @return 克隆后的对象
 */
export function cloneObject (obj) {
  return JSON.parse(JSON.stringify(obj))
}

/**
 * 随机生成数字
 *
 * 示例：生成长度为 12 的随机数：randomNumber(12)
 * 示例：生成 3~23 之间的随机数：randomNumber(3, 23)
 *
 * @param1 最小值 | 长度
 * @param2 最大值
 * @return int 生成后的数字
 */
export function randomNumber () {
  // 生成 最小值 到 最大值 区间的随机数
  const random = (min, max) => {
    return Math.floor(Math.random() * (max - min + 1) + min)
  }
  if (arguments.length === 1) {
    let [length] = arguments
    // 生成指定长度的随机数字，首位一定不是 0
    let nums = [...Array(length).keys()].map((i) => (i > 0 ? random(0, 9) : random(1, 9)))
    return parseInt(nums.join(''))
  } else if (arguments.length >= 2) {
    let [min, max] = arguments
    return random(min, max)
  } else {
    return Number.NaN
  }
}

/**
 * 随机生成字符串
 * @param length 字符串的长度
 * @param chats 可选字符串区间（只会生成传入的字符串中的字符）
 * @return string 生成的字符串
 */
export function randomString (length, chats) {
  if (!length) length = 1
  if (!chats) chats = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
  let str = ''
  for (let i = 0; i < length; i++) {
    let num = randomNumber(0, chats.length - 1)
    str += chats[num]
  }
  return str
}

/**
 * 重复值验证工具方法
 *
 * 使用示例：
 * { validator: (rule, value, callback) => validateDuplicateValue('sys_fill_rule', 'rule_code', value, this.model.id, callback) }
 *
 * @param tableName 被验证的表名
 * @param fieldName 被验证的字段名
 * @param fieldVal 被验证的值
 * @param dataId 数据ID，可空
 * @param callback
 */
export function validateDuplicateValue (tableName, fieldName, fieldVal, dataId, callback) {
  if (fieldVal) {
    let params = { tableName, fieldName, fieldVal, dataId }
    api.duplicateCheck(params).then(res => {
      res['success'] ? callback() : callback(res['message'])
    }).catch(err => {
      callback(err.message || err)
    })
  } else {
    callback()
  }
}

/**
 * 根据编码校验规则code，校验传入的值是否合法
 *
 * 使用示例：
 * { validator: (rule, value, callback) => validateCheckRule('common', value, callback) }
 *
 * @param ruleCode 编码校验规则 code
 * @param value 被验证的值
 * @param callback
 */
export function validateCheckRule (ruleCode, value, callback) {
  if (ruleCode && value) {
    value = encodeURIComponent(value)
    api.checkRuleByCode({ ruleCode, value }).then(res => {
      res['success'] ? callback() : callback(res['message'])
    }).catch(err => {
      callback(err.message || err)
    })
  } else {
    callback()
  }
}

/**
 * 可用于判断是否成功
 * @type {symbol}
 */
export const succeedSymbol = Symbol()
/**
 * 可用于判断是否失败
 * @type {symbol}
 */
export const failedSymbol = Symbol()

/**
 * 使 promise 无论如何都会 resolve，除非传入的参数不是一个Promise对象或返回Promise对象的方法
 * 一般用在 Promise.all 中
 *
 * @param promise 可传Promise对象或返回Promise对象的方法
 * @returns {Promise<any>}
 */
export function alwaysResolve (promise) {
  return new Promise((resolve, reject) => {
    let p = promise
    if (typeof promise === 'function') {
      p = promise()
    }
    if (p instanceof Promise) {
      p.then(data => {
        resolve({ type: succeedSymbol, data })
      }).catch(error => {
        resolve({ type: failedSymbol, error })
      })
    } else {
      reject('alwaysResolve: 传入的参数不是一个Promise对象或返回Promise对象的方法')
    }
  })
}
export function copy(text, callback) {
  // 实现复制方法一：
  if (navigator.clipboard) {
    navigator.clipboard.writeText(text);
    callback && callback(true);
    return;
  }

  // 实现复制方法二：
  let copyInput = document.getElementById('copyInput');
  if (!copyInput) {
    let copyInput = document.createElement('input');
    copyInput.setAttribute('id', 'copyInput');
    copyInput.style.position = 'fixed';
    copyInput.style.left = '-100%';
    copyInput.style.top = '0';
    copyInput.style.zIndex = '-100';
    copyInput.style.opacity = '0';
    document.body.appendChild(copyInput);
  }
  copyInput.value = text;
  copyInput.focus();
  copyInput.select();

  // document.execCommand 可能会被废弃
  if (document.execCommand('copy')) {
    document.execCommand('copy');
  }

  copyInput.blur();

  callback && callback(true);
}


//webOffice
// 打开在线编辑页码
export function ShowPage(open="",save="",savePdf,savePdfAntChapter,reEditServe){ 
    var varpath = decodeURI(window.location.href);
    var root = varpath.split('/t_spcyjcy/')[0];
    if(varpath.indexOf(bootConfig[process.env.NODE_ENV].EXTERNAL_ACCESS_URL) !== -1){
      root = bootConfig[process.env.NODE_ENV].EXTERNAL_ACCESS_URL+process.env.BASE_URL
    }
    var path='/webOffice/index.html';
    var strUrl;
    var pre = "WebOffice://|Officectrl|";//智能窗打开的固定参数
    var v = getBrowser();	
    if(v==1){//当浏览器返回值为1时定义为使用智能窗方式打开网址
      strUrl = pre + root + path ;
      if(typeof open !== 'undefined' && open !== '') {
        window.open(strUrl + encodeURI('?' + open + 'o_s' + save+ 'o_s' + savePdf+ 'o_s' + savePdfAntChapter + 'o_s' + reEditServe),'_self','location=no'); //实现传参
      }else {
        window.open(strUrl,'_self');
      }
    }
    else{ //当浏览器返回值1以外的数据时采用传统方式打开网址
      strUrl = root + path;		 
      window.open(strUrl,'_blank');
    }	 
  
}

// 判断浏览器 适应当前浏览器
function getBrowser(){	
  var Sys = {};
  var ua = navigator.userAgent.toLowerCase();
  var s;
  var ver;
    (s = ua.match(/edge\/([\d.]+)/)) ? Sys.edge = s[1] :
    (s = ua.match(/rv:([\d.]+)\) like gecko/)) ? Sys.ie = s[1] :
    (s = ua.match(/msie ([\d.]+)/)) ? Sys.ie = s[1] :
    (s = ua.match(/firefox\/([\d.]+)/)) ? Sys.firefox = s[1] :
    (s = ua.match(/chrome\/([\d.]+)/)) ? Sys.chrome = s[1] :
    (s = ua.match(/opera.([\d.]+)/)) ? Sys.opera = s[1] :
    (s = ua.match(/version\/([\d.]+).*safari/)) ? Sys.safari = s[1] : 0;
  if (Sys.edge) return 1;
  if (Sys.ie) return 0;
    if (Sys.firefox) return 1;
    if (Sys.chrome){ ver = Sys.chrome;ver.toLowerCase();var arr = ver.split('.');if(parseInt(arr[0])>43){return 1;}else{return 0;}}
    if (Sys.opera) return 1;
    if (Sys.safari) return 1;
  return 1;
}
